/**
 * 
 */
package pruebas.VerduleriaOl.riuCliente;

import java.io.Serializable;
import java.util.List;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.inject.Inject;
import javax.inject.Named;

import pruebas.VerduleriaOl.dominio.entidades.TipoArticulo;
import pruebas.VerduleriaOl.dominio.servicio.PsGondola;

import com.intelap.fabricaciones.ConocedorUnidadTrabajoActual;
import com.intelap.fabricaciones.UnidadTrabajo;
import com.intelap.jsfLib.ayudaDaosJava.AyudaDaoBusqueda_Java;
import com.intelap.jsfLib.decoracion.DaoBusqueda;
import com.intelap.jsfLib.decoracion.DciBuscador;
import com.intelap.jsfLib.decoracion.DciCampo.DcaCampo;
import com.intelap.pureFabrications.AccesoPropMutableObservable;
import com.intelap.pureFabrications.AccesoPropMutableObservable.AccesoPropMutableObservableImpl;

/** @author ggpollit */
@Named
@ConversationScoped
public class RiuGondola implements Serializable {
	@Inject
	private Logger logger;
	@Inject
	private Conversation conversacion;
	@Inject
	private UnidadTrabajo unidadTrabajo;
	@Inject
	private PsGondola psGondola;

	@PostConstruct
	void inicializar() {
		this.conversacion.begin();
		logger.info("Conversacion "+conversacion.getId()+ " abierta por RiuGondola.");
	}

	//////////////////////

	private MdcBuscadorTipoArticulo mdcBuscadorTipoArticulo = null;
	public MdcBuscadorTipoArticulo getMdcBuscadorTipoArticulo() {
		if (this.mdcBuscadorTipoArticulo == null) {
			this.mdcBuscadorTipoArticulo = new MdcBuscadorTipoArticulo(this.accesoTipoArticuloElegido);
		}
		return this.mdcBuscadorTipoArticulo;
	}

	private final AccesoPropMutableObservable<TipoArticulo> accesoTipoArticuloElegido = new AccesoPropMutableObservableImpl<TipoArticulo>(null);

	private class MdcBuscadorTipoArticulo extends DciBuscador.MdcBuscadorPi<TipoArticulo, TipoArticuloAdaptado> {
		public MdcBuscadorTipoArticulo(AccesoPropMutableObservable<TipoArticulo> acceso) {
			super(acceso, null);
		}

		@Override
		public String getEncabezadoTabla() {
			return "Gondola";
		}

		@Override
		protected Class<TipoArticuloAdaptado> getTipoElemsAdaptados() {
			return TipoArticuloAdaptado.class;
		}

		@Override
		protected TipoArticulo getRespaldo(TipoArticuloAdaptado elementoAdaptado) {
			return elementoAdaptado.respaldo;
		}

		@Override
		protected DaoBusqueda<TipoArticuloAdaptado> getDaoBusqueda() {
			return this.daoBusquedaTipoArticulo;
		}
		private final DaoBusqueda<TipoArticuloAdaptado> daoBusquedaTipoArticulo = new AyudaDaoBusqueda_Java<TipoArticulo, TipoArticuloAdaptado>() {
			@Override
			protected List<TipoArticulo> getElementos() {
				return psGondola.getTiposArticulos();
			}
			@Override
			protected Class<TipoArticuloAdaptado> getTipoElems() {
				return MdcBuscadorTipoArticulo.this.getTipoElemsAdaptados();
			}
			@Override
			protected TipoArticuloAdaptado adaptar(TipoArticulo elementoGenuino) {
				return new TipoArticuloAdaptado(elementoGenuino);
			}
		};
	}

	public static class TipoArticuloAdaptado {
		final TipoArticulo respaldo;
		TipoArticuloAdaptado(TipoArticulo respaldo) {
			this.respaldo = respaldo;
		}
		@DcaCampo
		public String getNombre() {
			return respaldo.getNombre();
		}
	}


	/////////////////////

	public void botonCargarHaSidoPresionado() {
		if (this.accesoTipoArticuloElegido.getValor() == null)
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Antes debe elegir un artículo"));
		else {
			this.psGondola.ponerArticulosEnCarrito(accesoTipoArticuloElegido.getValor(), 1);
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage("Ha agregado un/una " + accesoTipoArticuloElegido.getValor().getNombre()));
		}
	}

	//////////////////////

	public PhaseListener getPhaseListener() {
		return new PhaseListener() {
			@Override
			public PhaseId getPhaseId() {
				return PhaseId.ANY_PHASE;
			}
			@Override
			public void beforePhase(PhaseEvent event) {
				ConocedorUnidadTrabajoActual.setActual(unidadTrabajo);
			}
			@Override
			public void afterPhase(PhaseEvent event) {
				ConocedorUnidadTrabajoActual.setActual(unidadTrabajo);
			}
		};
	}
}
